import Vue from 'vue';
import VueI18n from 'vue-i18n';
import { setUtilsLocale } from 'pub-bbx-utils'
// common lang
import common from 'pub-bbx-global/lang/dist/common';
// project lang
import feLang from 'pub-bbx-global/lang/dist/project/fe';
import paasLang from 'pub-bbx-global/lang/dist/project/paas'; // fe中使用paas中组件的国际化
// en lang
import elEnLocale from 'element-ui/lib/locale/lang/en';
import elZhLocale from 'element-ui/lib/locale/lang/zh-CN';
import elJaLocale from 'element-ui/lib/locale/lang/ja';
import elKoLocale from 'element-ui/lib/locale/lang/ko';
import elRuLocale from 'element-ui/lib/locale/lang/ru-RU';
import ElementLocale from 'element-ui/lib/locale';
// utils
import { mergeLang, localStorageKey } from 'pub-bbx-global/lang/dist';
import { LangConfig } from 'pub-bbx-global/lang/dist/token';

export const pageNotBuildByUserInfo = ['/v_open/','/service/manage/provider/create']

// dayjs
import dayjs from 'dayjs';
import 'dayjs/locale/zh';
import 'dayjs/locale/en';
import 'dayjs/locale/ja';
import 'dayjs/locale/ko';
import 'dayjs/locale/ru';

// moment
import moment from 'moment-timezone'
import 'moment/dist/locale/zh-cn'
import 'moment/dist/locale/en-gb'
import 'moment/dist/locale/ja'
import 'moment/dist/locale/ko'
import 'moment/dist/locale/ru'

const momentLanMap: Record<string, string> = {
  zh: 'zh-cn',
  en: 'en-gb',
  ja: 'ja',
  ko: 'ko',
  ru: 'ru',
}

// import { GrayFunctionEnum } from 'pub-bbx-global/pageType/dist/grayFunction';
// import { getAllGrayInfo } from '@src/util/grayInfo';

Vue.use(VueI18n);

const loadedLanguages = ['zh', 'en', 'ja', 'ko', 'ru']; // 我们的预装默认语言


// en 语言数据
const elLocales: LangConfig = {
  zh: elZhLocale,
  en: elEnLocale,
  ja: elJaLocale,
  ko: elKoLocale,
  ru: elRuLocale,
};

// 语言数据
const messages: VueI18n.LocaleMessages = mergeLang(elLocales, common, paasLang, feLang) as VueI18n.LocaleMessages;
console.log(messages)

/**
 * 获取初始语言
 * @returns
 */
function getInitLocale() {
  const storageLocale = localStorage.getItem(localStorageKey);
  if (storageLocale && loadedLanguages.includes(storageLocale)) {
    // 缓存语言有的取缓存
    return storageLocale;
  }

  // 默认返回已有列表第一个
  return loadedLanguages[0];
}

export const i18n = new VueI18n({
  locale: getInitLocale(),
  fallbackLocale: 'zh', // 当本地化文本不存在时，回退到根级别 (全局) 本地化。
  fallbackRootWithEmptyString: true, // 在组件本地化中，当本地化文本为空字符串时，是否回退到根级别 (全局) 本地化。
  silentTranslationWarn: true, // 取消本地化失败时输出的警告
  silentFallbackWarn: true, // 回退到 fallbackLocale 或 root 时取消警告。
  messages,
});

export function transformI18n(message: any = '', locale = 'zh') {
  if (!message) {
    return '';
  }

  // 处理对象格式 {zh:"中文",en:"english",...}
  if (typeof message === 'object') {
    return message[locale] || '';
  }

  return i18n.t(message, locale) || '';
}

// 设置语言
function setI18nLanguage(lang: string) {
  i18n.locale = lang;
  dayjs.locale(lang);
  moment.locale(momentLanMap[lang] || 'zh-cn');
  localStorage.setItem(localStorageKey, lang);
  return lang;
}

/**
 * 异步加载语言包
 * @param lang
 * @returns
 */
export async function loadLanguageAsync(lang: string) {
  // 如果语言相同
  if (i18n.locale === lang) {
    return setI18nLanguage(lang);
  }

  // 如果语言已经加载
  if (loadedLanguages.includes(lang)) {
    return setI18nLanguage(lang);
  }

  return Promise.reject('no locale messages package!!!');
  // 目前方案不会走到这里，语言包都已经打包进项目了，将来异步加载后使用下面逻辑
  function setMessage(message: VueI18n.LocaleMessages) {
    i18n.setLocaleMessage(lang, message);
    loadedLanguages.push(lang);
    setI18nLanguage(lang);
  }

  // 对应项目基础语言包
  // 前期暂时先用本地打包好的语言包
  // const projectMessage = import(`../../../pub-bbx-global/lang/dist/public/fe-${lang}.js`)
  // projectMessage.then((module: {default: LangConfig}) => {
  //   setMessage({...messages[lang], ...module.default} as VueI18n.LocaleMessages)
  // })
}

/**
 * 初始化加载语言
 */
async function initLocale() {
  try {
    setI18nLanguage(i18n.locale);
    // 部分分享外链的无token页面不需要从接口获取主语言
    const url_ = window.location.href;
    const isPass = pageNotBuildByUserInfo.find(item => url_.includes(item));
    if (isPass) return;
    const { getCurrentLanguage } = await import('@src/api/SystemApi') // http 内有引用i18n，会引起循环引用, 所以这里使用异步引入
    const { currentLanguageKey, tenantMainLanguageKey = 'zh' } = await getCurrentLanguage();
    i18n.fallbackLocale = tenantMainLanguageKey // 回退语言使用租户主语言
    if (currentLanguageKey !== i18n.locale) {
      await loadLanguageAsync(currentLanguageKey);
      // const r = await import('@src/router'); // 这里使用异步获取router，因为router中有使用locales-i18n，会引起循环引用
      // r.default.push('/reload')
      location.reload();
    }
  } catch (error) {
    console.warn(error, 'error try catch getCurrentLanguage');
  }
}

/**
 * 获取翻译 返回类型需要string时调用
 * @param message
 * @returns {String}
 */
export const t = (message: string, values?: VueI18n.Values) => {
  const result = i18n.t(message, values);
  return typeof result === 'string' ? result : message;
};

Vue.prototype.t = t;

{
  // * start
  ElementLocale.i18n((key: string, value: string) => i18n.t(key, value));
  setUtilsLocale({
    i18n: t
  })
  // 初始加载语言
  initLocale();

  // @ts-ignore (为了提供打包处理不打包i18n处理使用)
  window.i18n = i18n
}

export default i18n;
